﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Dominio.Negocio;

/// <summary>
/// Almacena la sessión y la cookie de la aplicación.
/// </summary>
namespace Util 
{
    public static class MiSession
    {
        #region Propiedades del usuario.
        /// <summary>
        /// Obtiene el usuario de la sesión
        /// </summary>
        public static string UserName { 
            get 
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["UserName"].ToString();
                return "";
            }
            set 
            {
                HttpContext.Current.Session["UserName"] = value;
            }
        }
        
        /// <summary>
        /// Nombre del Usuario
        /// </summary>
        public static string Nombre {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["Nombre"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["Nombre"] = value;
            }
        }

        /// <summary>
        /// Primer apellido del Usuario
        /// </summary>
        public static string PrimerApellido {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["PrimerApellido"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["PrimerApellido"] = value;
            }
        }

        /// <summary>
        /// Segundo apellido del Usuario
        /// </summary>
        public static string SegundoApellido {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["SegundoApellido"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["SegundoApellido"] = value;
            }
        }

        /// <summary>
        /// Unidad del Usuario
        /// </summary>
        public static int IdUnidad {
            get
            {
                if (!IsSessionTimedOut())
                    return int.Parse(HttpContext.Current.Session["IdUnidad"].ToString());
                return 0;
            }
            set
            {
                HttpContext.Current.Session["IdUnidad"] = value;
            }
        }

        /// <summary>
        /// Unidad del Usuario
        /// </summary>
        public static string Matricula {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["Matricula"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["Matricula"] = value;
            }
        }

        /// <summary>
        /// Edificio del Usuario
        /// </summary>
        public static int IdEdificio
        {
            get
            {
                if (!IsSessionTimedOut())
                    return int.Parse(HttpContext.Current.Session["IdEdificio"].ToString());
                return 0;
            }
            set
            {
                HttpContext.Current.Session["IdEdificio"] = value;
            }
        }

        /// <summary>
        /// Tipo de jornada del Usuario
        /// </summary>
        public static string TipoJornada {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["TipoJornada"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["TipoJornada"] = value;
            }
        }

        /// <summary>
        /// Posición del Usuario
        /// </summary>
        public static string PosicionTrabajador
        {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["PosicionTrabajador"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["PosicionTrabajador"] = value;
            }
        }

        /// <summary>
        /// Jefe del Usuario
        /// </summary>
        public static string PosicionJefe {
            get
            {
                if (!IsSessionTimedOut())
                    return HttpContext.Current.Session["PosicionJefe"].ToString();
                return "";
            }
            set
            {
                HttpContext.Current.Session["PosicionJefe"] = value;
            }
        }

        /// <summary>
        /// Indica si el usuario trabaja el sabado.
        /// </summary>
        public static bool TrabajaSabado {
            get
            {
                if (!IsSessionTimedOut())
                    return bool.Parse(HttpContext.Current.Session["TrabajaSabado"].ToString());
                return false;
            }
            set
            {
                HttpContext.Current.Session["TrabajaSabado"] = value;
            }
        }
        
        #endregion

        /// <summary>
        /// Obtiene la cookie de la sesión.
        /// </summary>
        public static string MiCookies { 
            get
            {
                string cookie;
                if (HttpContext.Current.Request.Cookies["micookie"] != null)
                {
                    cookie = HttpContext.Current.Request.Cookies["micookie"].ToString();
                }
                else
                {
                    cookie= null;
                }

                return  cookie;
            }
            set{}
        }
        //Todo: Mirar porque falla.
        private static bool IsSessionTimedOut()
        {
            HttpContext ctx = HttpContext.Current;
            if (ctx == null)
                throw new Exception("Este método sólo se puede usar en una aplicación Web");

            //Comprobamos que haya sesión en primer lugar 
            //(por ejemplo si por ejemplo EnableSessionState=false)
            if (ctx.Session == null)
                return false;   //Si no hay sesión, no puede caducar
            //Se comprueba si se ha generado una nueva sesión en esta petición
            if (!ctx.Session.IsNewSession)
                return false;   //Si no es una nueva sesión es que no ha caducado

            HttpCookie objCookie = ctx.Request.Cookies["ASP.NET_SessionId"];
            //Esto en teoría es imposible que pase porque si hay una 
            //nueva sesión debería existir la cookie, pero lo compruebo porque
            //IsNewSession puede dar True sin ser cierto (más en el post)
            if (objCookie == null)
                return false;

            //Si hay un valor en la cookie es que hay un valor de sesión previo, pero como la sesión 
            //es nueva no debería estar, por lo que deducimos que la sesión anterior ha caducado
            if (!string.IsNullOrEmpty(objCookie.Value))
                return true;
            else
                return false;

        }
    }
}
